vlapic_init alloc memory for struct vlapic, so it should do a memset on
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 5 Nov 2005 10:23:02 +0000 (11:23 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 5 Nov 2005 10:23:02 +0000 (11:23 +0100)
it, not vlapic_reset.

Signed-off-by: Xin Li <xin.b.li@intel.com>
xen/arch/x86/vmx_vlapic.c

index 31f47222d6d20a7bd0bbccbec83ff1112cb641b8..80f372f282b3e7013c6494e4fdb65342a6b1cd15 100644 (file)
@@ -659,7 +659,7 @@ unsigned long vlapic_write(struct vcpu *v, unsigned long address,
         vlapic->spurious_vec = val & 0x1ff;
         if (!(vlapic->spurious_vec & 0x100)) {
             int i = 0;
-            for (i=0; i < VLAPIC_LVT_NUM; i++) 
+            for (i = 0; i < VLAPIC_LVT_NUM; i++)
                 vlapic->lvt[i] |= 0x10000;
             vlapic->status |= VLAPIC_SOFTWARE_DISABLE_MASK;
         }
@@ -723,10 +723,12 @@ unsigned long vlapic_write(struct vcpu *v, unsigned long address,
         vlapic->timer_current = val;
         vlapic->timer_current_update = NOW();
 
-        VMX_DBG_LOG(DBG_LEVEL_VLAPIC,
-          "timer_init %x timer_current %x timer_current_update %08x%08x",
-          vlapic->timer_initial, vlapic->timer_current, (uint32_t)(vlapic->timer_current_update>>32), (uint32_t)vlapic->timer_current_update);
-        vlapic_begin_timer(vlapic);
+        VMX_DBG_LOG(DBG_LEVEL_VLAPIC, "timer_init %x timer_current %x"
+                    "timer_current_update %08x%08x",
+                    vlapic->timer_initial, vlapic->timer_current,
+                    (uint32_t)(vlapic->timer_current_update >> 32),
+                    (uint32_t)vlapic->timer_current_update);
+                    vlapic_begin_timer(vlapic);
         break;
 
     case APIC_TDCR:
@@ -920,26 +922,30 @@ void vlapic_post_injection(struct vcpu *v, int vector, int deliver_mode) {
 
 static int vlapic_reset(struct vlapic *vlapic)
 {
-    struct vcpu *v = vlapic->vcpu;
-    int apic_id = v->vcpu_id, i;
+    struct vcpu *v;
+    int apic_id, i;
 
-    if (!v || !vlapic)
-        return 0;
+    ASSERT( vlapic != NULL );
+
+    v = vlapic->vcpu;
 
-    memset(vlapic, 0,sizeof(struct vlapic));
+    ASSERT( v != NULL );
 
-    v->arch.arch_vmx.vlapic = vlapic;
+    apic_id = v->vcpu_id;
 
     vlapic->domain = v->domain;
 
     vlapic->id = apic_id;
 
+    vlapic->vcpu_id = v->vcpu_id;
+
     vlapic->version = VLAPIC_VERSION;
 
     vlapic->apic_base_msr = VLAPIC_BASE_MSR_INIT_VALUE;
 
     if (apic_id == 0)
         vlapic->apic_base_msr |= MSR_IA32_APICBASE_BSP;
+
     vlapic->base_address = vlapic_get_base_address(vlapic);
 
     for (i = 0; i < VLAPIC_LVT_NUM; i++)
@@ -949,9 +955,8 @@ static int vlapic_reset(struct vlapic *vlapic)
 
     vlapic->spurious_vec = 0xff;
 
-
     init_ac_timer(&vlapic->vlapic_timer,
-      vlapic_timer_fn, vlapic, v->processor);
+                  vlapic_timer_fn, vlapic, v->processor);
 
 #ifdef VLAPIC_NO_BIOS
     /*
@@ -966,10 +971,10 @@ static int vlapic_reset(struct vlapic *vlapic)
 #endif
 
     VMX_DBG_LOG(DBG_LEVEL_VLAPIC, "vlapic_reset: "
-      "vcpu=%p id=%d vlapic_apic_base_msr=%08x%08x "
-      "vlapic_base_address=%0lx",
-      v, vlapic->id, (uint32_t)(vlapic->apic_base_msr >> 32),
-      (uint32_t)vlapic->apic_base_msr, vlapic->base_address);
+                "vcpu=%p id=%d vlapic_apic_base_msr=%08x%08x "
+                "vlapic_base_address=%0lx",
+                v, vlapic->id, (uint32_t)(vlapic->apic_base_msr >> 32),
+                (uint32_t)vlapic->apic_base_msr, vlapic->base_address);
 
     return 1;
 }
@@ -978,15 +983,20 @@ int vlapic_init(struct vcpu *v)
 {
     struct vlapic *vlapic = NULL;
 
+    ASSERT( v != NULL );
+
     VMX_DBG_LOG(DBG_LEVEL_VLAPIC, "vlapic_init %d", v->vcpu_id);
 
     vlapic = xmalloc_bytes(sizeof(struct vlapic));
-
     if (!vlapic) {
         printk("malloc vlapic error for vcpu %x\n", v->vcpu_id);
         return -ENOMEM;
     }
 
+    memset(vlapic, 0, sizeof(struct vlapic));
+
+    VLAPIC(v) = vlapic;
+
     vlapic->vcpu = v;
 
     vlapic_reset(vlapic);